Conversation
Scoped deliberately small per the user's steer: scaffolding, not a system. The hard part of multi-platform support is the Hermes port, not this ledger, and a rich gate built against zero second platforms would be inventing structure for a problem not yet met. Ships one JSON ledger plus one test with two assertions -- every artifact claimed by exactly one capability, and every claimed path exists. Both can fail today, with one platform. That is the bar. A capability, not a file, is the unit: platforms implement the same capability differently (Codex uses filename-derived prompt files, Hermes registers commands in plugin code), so file-for-file would force a correspondence that cannot exist. Unported platforms are ABSENT from platforms[] rather than present-with-nulls, so there is no half-truth to maintain. DROPPED an exemption assertion that an earlier draft had. With zero exemptions it could never fail -- the vacuous-coverage pattern that appeared four separate times building the EDD harness. Exemptions are filed instead, to be designed against a real cannot-support case with a test that can actually fail. Four follow-ups filed so the deferred work is durable rather than conversational, including the user's specific concern that the harness EXISTING is not the same as EDD being DONE (the corpus covers one scenario against 22 artifacts) and that parity must be REASSESSED on every platform added, not once. Claude-Session: https://claude.ai/code/session_01WBqyLnBbYEi5hp2noc3cMC
…tion Symlinked artifacts under a walked root were silently skipped since readdirSync's isFile() is false for symlinks (lstat semantics) -- a symlinked file could ship via git without ever needing to be claimed in the parity ledger. walkArtifacts now recurses only on isDirectory() and treats every other entry (including symlinks) as a leaf. Also split the "exactly one capability" gate test into two separate tests (unclaimed, doubleClaimed) so a stray unclaimed file can no longer mask a genuine double-claim by throwing first.
walkArtifacts() read the filesystem directly, so a macOS .DS_Store recreated under skills/ (ignored by .gitignore) tripped the parity gate with "add them to docs/parity-ledger.json" -- wrong advice for a file that never ships. Since --no-verify is banned here, that hard-blocked every macOS developer while CI on a clean checkout was unaffected. Filter the walk through a single `git check-ignore --stdin` call, failing open (returning everything) if git is missing, errors, or rootDir isn't a git repository -- fixtureRepo()'s temp dirs stay ungitted and must keep passing unchanged. Deliberately not `git ls-files`: that means "tracked", and an untracked-but-not-ignored new artifact must still be walked or the gate stops catching the exact miss it exists for.
cfdude
added a commit
that referenced
this pull request
Aug 4, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Implements
docs/superpowers/specs/2026-07-31-platform-parity-mechanism-design.md(theplatform-parity-mechanismepic), perdocs/superpowers/plans/2026-08-03-platform-parity-mechanism.md.What this is
Claude Code is the permanent base platform; every other platform is held to parity with it. This is the mechanical layer of parity enforcement — it catches "you added a capability and never considered porting it," the one failure mode that exists even with a single platform and the one EDD structurally cannot catch (a forgotten capability has no scenario, so a corpus run stays green while the gap widens).
docs/parity-ledger.json— 9 capabilities claiming all 22 shipped artifacts. A capability is the unit, not a file: platforms implement the same capability differently (Codex derives command names from prompt-file stems, Hermes registers commands in plugin code), so a file-for-file mapping would force a correspondence that cannot exist. Unported platforms are absent fromplatforms[], not present-with-nulls — no half-truth to maintain.scripts/test/parity-helpers.mjs+scripts/test/parity.test.mjs— the gate. Every artifact undercommands/,agents/,skills/,hooks/,.claude-plugin/must be claimed by exactly one capability, and every claimed path must exist.Both assertions can fail today
That was the bar the spec set, in reaction to four vacuous guard tests found while building the EDD harness. Verified by falsification, not by assertion:
commands/zzz-scratch.mdagents/reconciler.mdclaimed twiceagents/reconciler.mdremovedskills/conductor/references/foo.mdThe fixture tests and the CI gate call the same
parityViolations(). A re-implementation seam would have proved nothing about what actually runs — the same trap as the hook-JSON regex that matched zero commands.An earlier draft had a third assertion, "every exemption carries a reason." With zero exemptions it could never fail, so exemptions were dropped entirely and filed as
parity-ledger-exemptions, to be designed against a real can't-support case with a test that can actually fail.Two holes found by the final review, both fixed
readdiruses lstat semantics, soentry.isFile()is false for a symlink — a symlinked artifact shipped via git without ever needing to be claimed. The walk now recurses only on directories and treats everything else as a leaf.unclaimedfirst, so a stray unclaimed file threw beforedoubleClaimedwas ever evaluated. Split.And one usability fix
The walk reads the filesystem, so it also picked up git-ignored cruft — a macOS
.DS_Storeunderskills/failed the gate locally with wrong advice, and since--no-verifyis banned here, hard-blocked the commit.walkArtifactsnow filters through one batchedgit check-ignore --stdinand fails open outside a git repo.Deliberately not
git ls-files: that means tracked, and a brand-new unstagedcommands/foo.mdis untracked-but-not-ignored — filtering on tracked-ness would reintroduce exactly the miss this gate exists to catch. There's an anti-trap test asserting that file is still walked, and an in-code warning for the next person tempted to simplify it.No version bump — stated, not skipped
No
CHANGELOG.mdentry, noMIGRATIONSentry, no README/Mintlify change. Nothing user-facing ships: no subcommand, no flag, nostate.jsonschema change. This is a repo-maintenance gate in the same class as the existing SKILL.md/README.md dispatch-drift tests, which are likewise unversioned. Version stays0.25.0.CLAUDE.mdgains the obligation next to release discipline, so the next person adding a command knows the ledger exists.Tests
301 passing, 0 failing (287 baseline + 14 parity tests).
Consequence
hermes-platform-supportnow has no remaining unarchiveddepends-on. Its port proceeds under the gate — claiming each capability as it goes, rather than reconstructing them afterward.https://claude.ai/code/session_01BigZtNRPv6wBuZZ9ipUHW5